package org.rqb.panel.partPanel;

import lombok.extern.slf4j.Slf4j;
import org.rqb.Constant;
import org.rqb.config.MyConfig;
import org.rqb.frame.GestureWindow;
import org.rqb.frame.MyFrame;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Properties;

@Slf4j
public class SetPanel extends javax.swing.JPanel {
    private MyFrame myFrame;

    private JCheckBox startOnPowerCheckBox;
    private JCheckBox mouseGesturesCheckBox;
    private JCheckBox hideOnExitCheckBox;
    private JCheckBox autoMinimizesOnStartupCheckBox;
    private Properties config = MyConfig.getConfig();

    // 定义源文件和目标文件路径
    private Path sourcePath = new File(Constant.WORK_DIR + "\\" + Constant.INSTALL_PKG).toPath();
    private Path targetPath = new File(Constant.USER_HOME + "\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\" + Constant.INSTALL_PKG).toPath();
    private GestureWindow gestureWindow = GestureWindow.getInstance();

    public SetPanel(MyFrame myFrame) {
        this.myFrame = myFrame;
        this.setLayout(new BorderLayout());

        checkBoxInit();
    }

    public void checkBoxInit() {
        // 创建一个面板容器，用于放置复选框
        JPanel checkBoxPanel = new JPanel(new GridLayout(4, 1));  // 使用 GridLayout 来让每个复选框占据一行

        // 创建开关按钮（复选框）
        startOnPowerCheckBox = new JCheckBox("开机启动");
        mouseGesturesCheckBox = new JCheckBox("开启快捷手势");
        autoMinimizesOnStartupCheckBox = new JCheckBox("开启自动最小化到系统托盘");
        hideOnExitCheckBox = new JCheckBox("退出时，隐藏到系统托盘");

        // 设置复选框的初始状态
        initCheckBoxIsSelect(startOnPowerCheckBox, Constant.CONFIG_START_UP_FIELD);
        initCheckBoxIsSelect(hideOnExitCheckBox, Constant.CONFIG_HIED_ONEXIT_FIELD);
        initCheckBoxIsSelect(autoMinimizesOnStartupCheckBox,Constant.AUTO_HIDE_WINDOW_ONSTART);
        initCheckBoxIsSelect(mouseGesturesCheckBox,Constant.GESTURE_ENABLED);

        // 将复选框添加到面板中
        checkBoxPanel.add(startOnPowerCheckBox);
        checkBoxPanel.add(mouseGesturesCheckBox);
        checkBoxPanel.add(autoMinimizesOnStartupCheckBox);
        checkBoxPanel.add(hideOnExitCheckBox);

        // 将面板添加到 SetPanel 中
        this.add(checkBoxPanel, BorderLayout.CENTER);

        validate();
        repaint();
    }

    private void initCheckBoxIsSelect(JCheckBox checkBox, String configField) {
        if ("true".equals(config.get(configField))) {
            checkBox.setSelected(true);
        } else {
            checkBox.setSelected(false);
        }

    }

    public void updateConfig() {
        HashMap<String, String> configMap = new HashMap<>();

        isSelect(startOnPowerCheckBox, configMap);
        isSelect(hideOnExitCheckBox,configMap);
        isSelect(autoMinimizesOnStartupCheckBox,configMap);
        isSelect(mouseGesturesCheckBox,configMap);

        //设置开机启动，并改变配置文件和复选框的选中状态
        if (!setStartUpOnPower("true".equals(configMap.get(Constant.CONFIG_START_UP_FIELD)))) { // 没有开机启动设置成功
            //改正checkBox为未选中
            startOnPowerCheckBox.setSelected(false);
            configMap.put(Constant.CONFIG_START_UP_FIELD, "false"); // 设置配置文件为开机不启动
        }
        if ("true".equals(configMap.get(Constant.CONFIG_HIED_ONEXIT_FIELD))){
            //更新myFrame的关闭参数
            myFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

        } else {
            myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }

        //根据配置开启或关闭快捷手势
        if ("true".equals(configMap.get(Constant.GESTURE_ENABLED))) {

            gestureWindow.startMouseGestures();
        } else {
            gestureWindow.stopMouseGestures();
        }

        // 更新配置文件
        MyConfig.updateConfig(configMap);
    }

    private void isSelect(JCheckBox checkBox, HashMap<String, String> configMap) {
        switch (checkBox.getText()) {
            case "开机启动":
                configMap.put(Constant.CONFIG_START_UP_FIELD, checkBox.isSelected() ? "true" : "false");
                break;
            case "退出时，隐藏到系统托盘" :
                configMap.put(Constant.CONFIG_HIED_ONEXIT_FIELD,checkBox.isSelected() ? "true" : "false");
                break;
            case "开启自动最小化到系统托盘" :
                configMap.put(Constant.AUTO_HIDE_WINDOW_ONSTART, checkBox.isSelected() ? "true" : "false");
                break;
            case "开启快捷手势" :
                configMap.put(Constant.GESTURE_ENABLED, checkBox.isSelected() ? "true" : "false");
        }
    }

    /**
     * 设置是否开机启动
     *
     * @param isStartUpOnPower
     */
    private boolean setStartUpOnPower(boolean isStartUpOnPower) {
        if (isStartUpOnPower) {
            try {
                // 检查目标文件是否已存在
                if (!Files.exists(targetPath)) {
                    // 如果目标文件不存在，创建软链接
                    Files.createSymbolicLink(targetPath, sourcePath);
                    log.info("软链接已成功创建到启动文件夹。");
                    return true;
                } else {
                    // 如果文件已存在，不进行创建
                    log.info("软链接已存在，跳过创建。");
                    return true;
                }

            } catch (FileAlreadyExistsException e) {
                log.info("软链接已经存在: " + e.getMessage());
                return true;
            } catch (UnsupportedOperationException e) {
                log.warn("当前系统不支持软链接创建: " + e.getMessage());
                return false;
            } catch (IOException e) {
                log.error("开机启动项设置失败: " + e.getMessage());
                // 弹出框
                JOptionPane.showMessageDialog(this, "开机启动设置失败，没有操作权限,请以管理员身份运行再添加开机启动！");
                return false;
            } catch (SecurityException e) {
                log.warn("没有权限创建软链接: " + e.getMessage());
                return false;
            }
        } else { // 不是开机启动，删除开机启动快捷键
            if (!Files.exists(targetPath)) { // 开机目标不存在
                return true;
            }
            // 删除文件
            try {
                Files.delete(targetPath);
                log.info("删除启动快捷键成功");
                return true;
            } catch (IOException e) {
                log.warn("删除开机启动文件失败");
                return false;
            }
        }
    }
}
